// 类(Class)

// class Person {
//     // 在TS中需要明确在类型中声明所拥有的属性
//     name: string
//     age: number
//     constructor(name: string, age: number) {
//         this.name = name
//         this.age = age
//     }
//     say(value: string): void {
//         console.log(`my name is ${this.name},${value}`);
//     }
// }
// 类的访问修饰符
class Person {
    // 默认就是公有属性
    public name: string
    // 属性“age”为私有属性，只能在类“Person”及其子类中访问。
    private age: number
    // 属性“sex”受保护，只能在类“Person”及其子类中访问。
    protected sex: string
    constructor(name: string, age: number) {
        this.name = name
        this.age = age
        this.sex = 'man'
    }
    say(value: string): void {
        console.log(`my name is ${this.name},${value}`);
    }
}

const jack = new Person('jack', 18)
// 外部只能访问到name属性
console.log(jack.name) // jack
jack.say('hello world') // my name is jack,hello,world


// class Student extends Person {
//     constructor(name: string, age: number) {
//         super(name, age)
//         // 子类可以访问父类中protected的属性
//         this.sex
//     }
// }


class Student extends Person {
    // 如果构造函数前面加上private修饰,那么该类不能被实例化,不能被继承
    private constructor(name: string, age: number) {
        super(name, age)
        // 子类可以访问父类中protected的属性
        this.sex
    }
    // 可以添加一个静态方法来用作实例化
    static create(name: string, age: number) {
        return new Student(name, age)
    }
}
// 类“Student”的构造函数是私有的，仅可在类声明中访问。ts(2673)
// const tom = new Student('tom', 18)
const tom = Student.create('tom', 18)

export { }